package com.example.netty.sockettwo;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class CustomHexDecoderTwo extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 在输入缓冲区中搜索 "F3 3F" 序列
        while (in.isReadable()) {
            // 标记当前读取索引
            in.markReaderIndex();
            // 尝试找到 "F3 3F" 序列的索引
            int index = findF33FSequence(in);
            if (index != -1) {
                // 找到 "F3 3F" 序列，读取数据直到索引位置
                ByteBuf message = in.readSlice(index - in.readerIndex() + 2);
//                // 将读取指针移动到 readSlice 结束处
//                in.readerIndex(index + 2);
                // 将 ByteBuf 转换为字节数组
                byte[] byteArray = new byte[message.readableBytes()];
                message.readBytes(byteArray);
                // 将处理后的数据 (byteArray) 添加到输出列表
                out.add(byteArray);
            } else {
                // 未找到，重置读取索引并等待更多数据
                in.resetReaderIndex();
                break;
            }
        }
    }

    // 查找 "F3 3F" 序列的索引
    private int findF33FSequence(ByteBuf buffer) {
        for (int i = buffer.readerIndex(); i < buffer.writerIndex() - 1; i++) {
            if (String.format("%02X",buffer.getByte(i)).equals("F3") && String.format("%02X", buffer.getByte(i + 1)).equals("3F")) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 在这里处理异常
        cause.printStackTrace();
        ctx.close();
    }
}
